class Stack {   
    int count;   
    String[] data = new String[20];   
  
    public synchronized void push(String str) {   
        while (count == data.length) {   
            try {   
                this.wait();   
            } catch (InterruptedException e) {   
                e.printStackTrace();   
            }   
        }   
        this.notify();   
        data[count] = str;   
        count++;   
    }   
  
    public synchronized String get() {   
        while (count == 0) {   
            try {   
                this.wait();   
            } catch (InterruptedException e) {   
                e.printStackTrace();   
            }   
        }   
        this.notify();   
        count = count - 1;   
        return data[count];   
  
    }   
}  

class Stack {
	int count;
	String[] data = new String[20];

	public synchronized void push(String str) {
		while (count == data.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notify();
		data[count] = str;
		count++;
	}

	public synchronized String get() {
		while (count == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notify();
		count = count - 1;
		return data[count];

	}
}

Producerࣺ 
Java 
class Producer implements Runnable {   
    Stack Stackone;   
  
    public Producer(Stack s) {   
        Stackone = s;   
    }   
  
    public void run() {   
        String str;   
        for (int i = 0; i < 20; i++) {   
            str = String.valueOf(i + 1);   
            Stackone.push(str);   
            System.out.println("Product:" + str + "   count=" + Stackone.count);   
            try {   
                Thread.sleep((int) (Math.random() * 100));   
            } catch (InterruptedException e) {   
                e.printStackTrace();   
            }   
        }   
    }   
}  

class Producer implements Runnable {
	Stack Stackone;

	public Producer(Stack s) {
		Stackone = s;
	}

	public void run() {
		String str;
		for (int i = 0; i < 20; i++) {
			str = String.valueOf(i + 1);
			Stackone.push(str);
			System.out.println("Product:" + str + "   count=" + Stackone.count);
			try {
				Thread.sleep((int) (Math.random() * 100));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

Coumterࣺ 
Java 
class Coumter implements Runnable {   
    Stack stackOne;   
  
    public Coumter(Stack s) {   
        stackOne = s;   
    }   
  
    public void run() {   
        String s;   
        for (int i = 0; i < 20; i++) {   
            s = stackOne.get();   
            System.out.println("Coumet:" + s + "   count=" + stackOne.count);   
            try {   
                Thread.sleep((int) (Math.random() * 100));   
            } catch (InterruptedException e) {   
                e.printStackTrace();   
            }   
        }   
    }   
}  

class Coumter implements Runnable {
	Stack stackOne;

	public Coumter(Stack s) {
		stackOne = s;
	}

	public void run() {
		String s;
		for (int i = 0; i < 20; i++) {
			s = stackOne.get();
			System.out.println("Coumet:" + s + "   count=" + stackOne.count);
			try {
				Thread.sleep((int) (Math.random() * 100));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

StackTestࣺ 
Java 
public class StackTest {   
  
    public static void main(String[] args) {   
        Stack s = new Stack();   
        Producer p = new Producer(s);   
        Coumter c = new Coumter(s);   
        Thread t1 = new Thread(p);   
        Thread t2 = new Thread(c);   
        t1.start();   
        t2.start();   
    }   
}  

public class StackTest {

	public static void main(String[] args) {
		Stack s = new Stack();
		Producer p = new Producer(s);
		Coumter c = new Coumter(s);
		Thread t1 = new Thread(p);
		Thread t2 = new Thread(c);
		t1.start();
		t2.start();
	}
}

н£ 
Product:1   count=1 
Coumet:1   count=0 
Product:2   count=1 
Coumet:2   count=0 
Product:3   count=1 
Coumet:3   count=0 
Product:4   count=1 
Coumet:4   count=0 
Product:5   count=1 
Coumet:5   count=0 
Product:6   count=1 
Coumet:6   count=0 
Product:7   count=1 
Product:8   count=2 
Product:9   count=3 
Coumet:9   count=2 
Coumet:8   count=1 
Product:10   count=2 
Product:11   count=3 
Coumet:11   count=2 
Product:12   count=3 
Product:13   count=4 
Coumet:13   count=3 
Product:14   count=4 
Coumet:14   count=3 
Product:15   count=4 
Coumet:15   count=3 
Coumet:12   count=2 
Product:16   count=3 
Coumet:16   count=2 
Product:17   count=3 
Coumet:17   count=2 
Product:18   count=3 
Coumet:18   count=2 
Product:19   count=3 
Coumet:19   count=2 
Product:20   count=3 
Coumet:20   count=2 
Coumet:10   count=1 
Coumet:7   count=0 

